from collections.abc import Iterable  # 可迭代的对象
from collections.abc import Iterator  # 迭代器

# s = '北京欢迎你'
#
# for i in s:
#     print(i)

# for i in 123:
#     print(i)

# 可迭代对象: str, list, tuple, set, f, dict
# 所有的以上数据类型中都有一个函数__iter__(), 所有包含了__iter__()的数据类型都是可迭代的数据类型 Iterable
# dir()来查看一个对象,数据类型中包含了哪些东西

# lst = [1, 2, 3]  # list
# # print(dir(lst))
#
# s = "王尼玛"
# print("__iter__" in dir(s))
# print("__iter__" in dir(lst))
# print("__iter__" in dir(123))

# 迭代器: 可以使用next()函数来获取迭代器中的下一个元素, 直到迭代器中没有元素时, 迭代器会抛出StopIteration异常
# 迭代器的作用: 用来遍历可迭代对象, 节省内存, 提高效率

# 迭代器的创建:
# 1. 通过iter()函数创建迭代器
# 2. 通过生成器表达式创建迭代器
# 3. 通过内置函数range()创建迭代器

# from collections.abc import Iterable, Iterator
#
# lst = [1, 2, 3]
# lst_iter = iter(lst)
#
# print(isinstance(lst, Iterable))  # True
# print(isinstance(lst, Iterator))  # False
# print(isinstance(lst_iter, Iterator))  # True


# list 是一个Iterable 可迭代的对象
# lst = ['小米', '苹果', '华为', '三星']
#
# # 通过iter()函数创建迭代器
# it = lst.__iter__()
# # 通过next()函数获取迭代器中的下一个元素
# print(next(it))  # 小米
# print(next(it))  # 苹果
# print(next(it))  # 华为
# print(next(it))  # 三星
# print(next(it))      # StopIteration异常   迭代器中没有元素了 就会抛出StopIteration异常 报错


lst = ['小米', '苹果', '华为', '三星']

# # 模拟for循环
# it = lst.__iter__()
# while True:
#     try:
#         item = next(it)
#         print(item)
#     except StopIteration:  # 捕获StopIteration异常
#         break

# isinstance python内置函数, 判断一个对象是否是某个类型
# print(isinstance(lst, Iterable))  # True
# print(isinstance(lst, Iterator))  # False

it = lst.__iter__()
print(isinstance(it, Iterable))  # True  迭代器也是可迭代的
print(isinstance(it, Iterator))  # True  迭代器也是迭代器 list, tuple, set, dict, str, range, 都有__iter__()方法

print("__iter__" in dir(lst))  # True  可迭代对象都有__iter__()方法
print("__next__" in dir(lst))   # False  迭代器没有__next__()方法  所以不是一个迭代器

# 迭代器的特点:
# 1.节省内存
# 2.惰性机制
# 3.只能往前拿数据, 不能往后退
# 4.迭代器只能使用一次, 第二次使用需要重新创建迭代器